perm filename UTIL[C,JRA] blob sn#018731 filedate 1973-01-04 generic text, type T, neo UTF8
00100	(PROG2 (PUTPROP 'I1 (GET 'IF-NEEDED 'FSUBR) 'FSUBR)2)
00200	(DEFUN IF-NEEDED FEXPR (L) (INSERT (APPLY 'I1 L)))
00300	
00400	(COMMENT COMMENT FUNCTIONS)
00500	
00600	(CDEFUN TO-ACHIEVE ('GOAL "REST" 'CODE)
00700	   (COND ((TRUE GOAL) (RETURN 'ALREADY-ACHIEVED)))
00800	 :LP
00900	   (COND ((NULL CODE) (RAN-OUT))
01000	         ((CEVAL (CAR CODE)) (RETURN 'OK)))
01100	   (CSETQ CODE (CDR CODE))
01200	   (GO 'LP))
01300	
01400	(CDEFUN TO-MAKE ('GOAL "REST" 'CODE)
01500	 :LP
01600	   (COND ((NULL CODE) (RAN-OUT))
01700	         ((CEVAL (CAR CODE)) (RETURN 'OK)))
01800	   (CSETQ CODE (CDR CODE))
01900	   (GO 'LP))
02000	
02100	(CDEFUN SETUP ('SETUP 'CODE)
02200	   (CEVAL SETUP)
02300	   (CEVAL CODE))
02400	
02500	(CDEFUN MEANS ('DEF 'CODE) (CEVAL CODE))
02600	
02700	(CDEFUN NEED-ONLY ('SUF 'CODE) (CEVAL CODE))
02800	
02900	(CDEFUN STRATEGY ('AIM 'CODE)
03000	   "AUX"((WINNERS (CONS (LIST (VSUBST GOAL) (CONTROL)) WINNERS)))
03100	   (COND ((TRUE AIM)) (T (CEVAL CODE)))
03200	   NIL)
03300	
03400	(CDEFUN NEEDS ('NECESSARY 'CODE) "AUX"((SAVE CONTEXT))
03500	   (RETURN (CEVAL CODE))
03600	 :BACK
03700	   (COND ((TRUE NECESSARY) (NEEDBACK))
03800	         ((TRUE NECESSARY SAVE) (SCREWED)))
03900	   (DISPLACE (EXPRESSION (FRAME))
04000	      !"(SETUP (ACHIEVE ,NECESSARY) ,CODE))
04100	   (CSETQ CONTEXT SAVE ORIG NIL)
04200	   (CEVAL (EXPRESSION (FRAME)) (ACCESS)))
     

00100	(COMMENT UTILITY FUNCTIONS)
00200	
00300	(DEFUN DISPLACE (TA S)
00400	   (TERPRI)
00500	   (PRINT 'CLOBBERING)
00600	   (SPEW TA)
00700	   (PRINT 'TO)
00800	   (SPEW S)
00900	   (RPLACA TA (CAR S))
01000	   (RPLACD TA (CDR S))
01100	   TA)
01200	
01250	(DEFUN SPEW(X)(TERPRI)(SPRINT X 0 0))
01300	(CDEFUN FOR-EACH-ELEMENT ('ATOM LIST 'EXP)
01400	   (PROGBIND (LIST ATOM)
01500	    :LP
01600	      (COND ((NULL LIST) (RETURN NIL)))
01700	      (CSET ATOM (CAR LIST))
01800	      (CEVAL EXP)
01900	      (CSETQ LIST (CDR LIST))
02000	      (GO 'LP)))
02100	
02200	(CDEFUN FOR-EACH-DATUM ('BIND 'PAT 'EXP) "AUX"(POS (UPOS NIL))
02300	   (PROGBIND BIND
02400	      (CSETQ POS (GENERATE (TRUE1 PAT)))
02500	    :LP
02600	      (TRY-NEXT POS '(RETURN 'T))
02700	      (COND ((UNIQUE) (CEVAL EXP)))
02800	      (GO 'LP)))
02900	
03000	(DEFUN UNIQUE FEXPR (L) (PROG (E)
03100	   (SETQ L (CDR (VLOC 'UPOS)) E (MAPCAR 'RVALUE ,BIND))
03200	   (COND ((MEMBER E (CAR L)) (RETURN NIL)))
03300	   (RPLACA L (CONS E (CAR L)))
03400	   (RETURN T)))
03500	
03600	(CDEFUN IF ('COND 'EXP)
03700	   (COND ((TRUE COND) (CEVAL EXP (ACCESS)))))
     

00100	(COMMENT PROTECTION STUFF)
00200	
00300	(DEFUN PROTECT FEXPR (L)
00400	   (CSET 'PROTECTEDS (CONS (VSUBST (CAR L)) ,PROTECTEDS)))
00500	
00600	(CDEFUN PROTECTED ('EXP) "AUX"((CONTEXT (PUSH-CONTEXT)))
00700	   (REMOVE (VSUBST EXP))
00800	   (FOR-EACH-ELEMENT P PROTECTEDS
00900	      (COND ((TRUE P)) (T (RETURN T)))))
01000	
01100	(CDEFUN CHECK-PROTECTEDS ()
01200	   (FOR-EACH-ELEMENT P PROTECTEDS
01300	      (COND ((TRUE P)) (T (BUG PROTECTION-VIOLATION ,P)))))
01400	
01500	(IF-REMOVED MDB1 (NOT !>X) (ADD X))
01600	(INSERT 'MDB1)
01700	
01800	(CSETQ PROTECTEDS ())
01900	
02000	(DEFUN VSUBST (EXP)
02100	   (COND ((ATOM EXP) EXP)
02200	         ((EQ (CAR EXP) '/!/,) (RVALUE (CADR EXP)))
02300	         ((EQ (CAR EXP) '/!/;)
02400	          (COND ((ASSIGNED? (CADR EXP)) (RVALUE (CADR EXP)))
02500	                (T (LISTEN 'VSUBST-LOSE))))
02600	         (T (CONS (VSUBST (CAR EXP)) (VSUBST (CDR EXP))))))
02700	
02800	
02900	(DEFUN PREFIX (P V E) (PREFIX1 E))
03000	
03100	(DEFUN PREFIX1 (E)
03200	   (COND ((ATOM E)
03300	          (COND ((MEMQ E V) (LIST P E))  (T E)))
03400	         (T (CONS (PREFIX1 (CAR E)) (PREFIX1 (CDR E))))))
03500	
03600	
03700	(CDEFUN CHOOSE ('GOAL) 
03800	   (COND ((TRUE !"(POSSIBLE ,GOAL)))
03900	         (T (LISTEN !"(CAN NOT CHOOSE ,GOAL)))))
04000	
04100	
04200	(CDEFUN WINTEST () "AUX"((W (REVERSE WINNERS)))
04300	   :LP
04400	   (COND ((NULL W)(RETURN NIL))
04500	         ((TRUE (CAAR W)) (CONTINUE (CADAR W) 'OK)))
04600	   (CSETQ W (CDR W))
04700	   (GO 'LP))
04800	
04900	(CSETQ WINNERS ())
     

00100	(COMMENT HASH TABLE STUFF)
00200	
00300	(DEFUN GETP (EXP IND) (ASSOC IND (HASH (CDR EXP))))
00400	
00500	(DEFUN PUTP (EXP PROP IND)
00600	   ((LAMBDA (HASH)
00700	      (COND ((SETQ EXP (ASSOC IND HASH)) (RPLACA (CDR EXP) PROP))
00800	            (T (NCONC HASH (LIST (LIST IND PROP))))))
00900	    (HASH (CDR EXP))))
01000	
01100	(DEFUN HASH (EXP) (PROG (N F A)
01200	   (SETQ N (REMAINDER (MAKNUM EXP 'FIXNUM) TABSIZ))
01300	 LP(COND ((EQ (CAR (SETQ A (TAB N))) EXP) (RETURN A))
01400	         ((NULL (TAB N)) (STORE (TAB N) (SETQ A (LIST EXP)))
01500	          (RETURN A))
01600	         ((MINUSP (SETQ N (SUB1 N)))
01700	          (COND (F (CERR FULL HSHTAB)))
01800	          (SETQ F T  N (SUB1 TABSIZ))))
01900	   (GO LP)))
02000	
02100	(SETQ TABSIZ 500)
02200	(ARRAY TAB T TABSIZ)
02300